//
//  constClass.hpp
//  learnC++
//
//  Created by liuzhibing on 2018/7/8.
//  Copyright © 2018年 yunfan.com. All rights reserved.
//

#ifndef constClass_hpp
#define constClass_hpp

#include <stdio.h>
#include <iostream>

class Student2 {
    
public:
    int m_value;
//    请注意，构造函数不能标记为const。 这是因为构造函数需要能够初始化它们的成员变量，而const构造函数将无法这样做。 因此，该语言不允许const构造函数。
    Student2(int value = 0):m_value(value){
        
    }
    
    ~Student2(){
        
    }
//    事实证明，const类对象只能显式调用const成员函数
    void setValue(int value){ m_value = value;}
    
//    重载const和非const函数
//    最后，尽管不经常这样做，但是可以以这样的方式重载函数以具有相同函数的const和非const版本 如：
    int getValue() const {
        printf("const\n");
        return m_value ;
    }
    //non const 调用
    int getValue(){
        printf("non const\n");
        return m_value ;
    }
    
    // const函数中不能改变成员变量，否则编译报错
//    void resetValue() const{ m_value = 0;}
    
    void printSelf() const;
    
    void printStudent(const Student2 &st);
    
    
    
};
/*
 一旦通过构造函数初始化了const类对象，就不允许任何修改对象成员变量的尝试，因为它会违反对象的常量。 这包括直接更改成员变量（如果它们是公共的），或调用成员函数来设置成员变量的值。 考虑以下：
 const Student2 st;
 st.m_value = 10;  compile error
 */

#endif /* constClass_hpp */
